package jp.seraph.jsade.model;

import jp.seraph.jsade.math.Angle;
import jp.seraph.jsade.math.Point3D;

import org.apache.commons.math.geometry.Vector3D;

/**
 * 座標系を表すインターフェース
 * 
 * 
 */
public interface CoordinateSystem {
    /**
     * 親座標系からこの座標系への平行移動を表すベクトルを返す
     * 
     * @return
     */
    public Vector3D getTranslation();

    /**
     * 親座標系からの回転を考える際の回転軸を表すベクトルを返す。
     * 
     * @return 回転軸
     */
    public Vector3D getAxis();

    /**
     * 親座標系との相対角度を返す。 この座標系は親座標系と比べ、回転軸の右ねじ方向にこのメソッドが返す角度だけ、回転している。
     * 
     * @return 親座標との相対角度[°]
     */
    public Angle getRelativeAngle();

    /**
     * 親座標系との相対角度をradで返す。
     * 
     * @return
     */
    public double getRelativeAngleAsRad();

    /**
     * この座標系が、Rootとなる座標系かどうかを返す
     * 
     * @return
     */
    public boolean isRoot();

    /**
     * この座標系における、対象座標が、Root座標系におけるどの座標になるかを取得する。
     * 
     * @param aLocalPoint
     * @return Root座標系における座標
     */
    public Point3D getCoordinateAsRoot(Point3D aLocalPoint);
}
